import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = 'SimHei'
plt.rcParams['font.size'] = 15
data = pd.read_csv('../data/train.csv')
# 查看数据集字段信息
print("=============================查看数据集字段信息=============================")
data.info()
#  #   Column                    Non-Null Count  Dtype
# ---  ------                    --------------  -----
#  0   Attrition                 1100 non-null   int64
#  1   Age                       1100 non-null   int64
#  2   BusinessTravel            1100 non-null   object
#  3   Department                1100 non-null   object
#  4   DistanceFromHome          1100 non-null   int64
#  5   Education                 1100 non-null   int64
#  6   EducationField            1100 non-null   object
#  7   EmployeeNumber            1100 non-null   int64
#  8   EnvironmentSatisfaction   1100 non-null   int64
#  9   Gender                    1100 non-null   object
#  10  JobInvolvement            1100 non-null   int64
#  11  JobLevel                  1100 non-null   int64
#  12  JobRole                   1100 non-null   object
#  13  JobSatisfaction           1100 non-null   int64
#  14  MaritalStatus             1100 non-null   object
#  15  MonthlyIncome             1100 non-null   int64
#  16  NumCompaniesWorked        1100 non-null   int64
#  17  Over18                    1100 non-null   object
#  18  OverTime                  1100 non-null   object
#  19  PercentSalaryHike         1100 non-null   int64
#  20  PerformanceRating         1100 non-null   int64
#  21  RelationshipSatisfaction  1100 non-null   int64
#  22  StandardHours             1100 non-null   int64
#  23  StockOptionLevel          1100 non-null   int64
#  24  TotalWorkingYears         1100 non-null   int64
#  25  TrainingTimesLastYear     1100 non-null   int64
#  26  WorkLifeBalance           1100 non-null   int64
#  27  YearsAtCompany            1100 non-null   int64
#  28  YearsInCurrentRole        1100 non-null   int64
#  29  YearsSinceLastPromotion   1100 non-null   int64
#  30  YearsWithCurrManager      1100 non-null   int64
# 查看数据集均值，标准差等信息
print("=============================查看数据集均值，标准差等信息=============================")
print(data.describe())
# 统计离职在职人数
print("=============================统计离职在职人数=============================")
print(data['Attrition'].value_counts())

# 离职在职人数饼图
plt.figure(figsize=(8, 8))
plt.pie([data[data['Attrition'] == 0].shape[0], data[data['Attrition'] == 1].shape[0]],
        labels=['在职 (0)', '离职 (1)'],
        autopct='%1.1f%%',  # 显示格式化百分比
        colors=sns.color_palette('pastel'))  # 颜色

plt.title('员工离职与在职的比例饼状图')
plt.savefig('../img/员工离职与在职的比例饼状图.png', dpi=300, bbox_inches='tight')
plt.show()
# 结论：离职人数较少，离职率为16.2%

# 绘制 KDE 图
sns.kdeplot(data=data[data['Attrition'] == 1], x='Age', label='离职')
sns.kdeplot(data=data[data['Attrition'] == 0], x='Age', label='未离职')

# 设置中文横轴标签和标题
plt.xlabel('年龄', fontsize=12)
plt.ylabel('密度', fontsize=12)
plt.title('员工离职与年龄的核密度估计图', fontsize=14, pad=20)

# 显示网格、图例并保存显示图形
plt.grid(True)
plt.legend(loc='best')  # 设置图例位置
plt.tight_layout()  # 设置会自动调整子图之间的间距，防止图像元素重叠
plt.savefig('../img/员工离职与年龄的核密度估计图.png', dpi=300, bbox_inches='tight')
plt.show()

# 绘制 KDE 图
sns.kdeplot(data=data[data['Attrition'] == 1], x='MonthlyIncome', label='离职')
sns.kdeplot(data=data[data['Attrition'] == 0], x='MonthlyIncome', label='未离职')

# 设置中文横轴标签和标题
plt.xlabel('月薪', fontsize=12)
plt.ylabel('密度', fontsize=12)
plt.title('员工离职与月薪的核密度估计图', fontsize=14, pad=20)

# 显示网格、图例并保存显示图形
plt.grid(True)
plt.legend(loc='best')
plt.tight_layout()
plt.savefig('../img/员工离职与月薪的核密度估计图.png', dpi=300, bbox_inches='tight')
plt.show()

# 打印字段列名
print("=============================打印字段列名=============================")
print(data.columns)
# 查看对象类型字段取值
print("=============================查看对象类型字段取值列表=============================")
for column in data.columns:
    if data[column].dtype == object:
        print(f'{column} : {data[column].unique()}')
# 查看非对象类型字段取值
print("=============================查看非对象类型字段取值范围=============================")
for column in data.columns:
    if data[column].dtype != object:
        print(f'{column} : {data[column].min()} : {data[column].max()}')

# 空值检查 结论：没有空值
print("=============================空值检查=============================")
print(data.isna().sum())

# 分析离职和受教育程度的分析, 使用柱状图进行分析
# 结论：离职人员和在职人员的受教育程度分布差异不大，所以受教育程度对离职的影响不大
# 绘制受教育程度与离职情况的计数柱状图
sns.countplot(x="Education", hue="Attrition", data=data)
# 添加图表标题和坐标轴标签
plt.title('不同受教育程度员工的离职与在职人数对比', fontsize=14)
plt.xlabel('受教育程度', fontsize=12)
plt.ylabel('人数', fontsize=12)
# 显示图例并设置其位置
plt.legend(title='是否离职', loc='upper right')
plt.savefig('../img/离职和受教育程度相关性的分析.png', dpi=300, bbox_inches='tight')
plt.show()


# 5、分析离职和年龄、家庭和距离、月收入和 previously worked 的关系
# 1.离职和年龄的关系
sns.boxplot(x="Attrition", y="Age", data=data)
plt.xlabel('是否离职', fontsize=12)
plt.ylabel('年龄', fontsize=12)
plt.title('离职和年龄关系', fontsize=14)
plt.savefig('../img/离职和年龄关系.png', dpi=300, bbox_inches='tight')
plt.show()
# 2.离职和家庭和距离之间的关系
sns.boxplot(x="Attrition", y="DistanceFromHome", data=data)
plt.xlabel('是否离职', fontsize=12)
plt.ylabel('家庭距离', fontsize=12)
plt.title('离职和家庭距离关系', fontsize=14)
plt.savefig('../img/离职和家庭和距离关系.png', dpi=300, bbox_inches='tight')
plt.show()
# 3.离职和月收入的关系
sns.boxplot(x="Attrition", y="MonthlyIncome", data=data)
plt.xlabel('是否离职', fontsize=12)
plt.ylabel('月收入', fontsize=12)
plt.title('离职和月收入关系', fontsize=14)
plt.savefig('../img/离职和月收入关系.png', dpi=300, bbox_inches='tight')
plt.show()
# 4.离职和曾经工作公司的关系
sns.boxplot(x="Attrition", y="NumCompaniesWorked", data=data)
plt.xlabel('是否离职', fontsize=12)
plt.ylabel('曾经工作公司数量', fontsize=12)
plt.title('离职和曾经工作公司数量的关系', fontsize=14)
plt.savefig('../img/离职和曾经工作公司数量的关系.png', dpi=300, bbox_inches='tight')
plt.show()
# 结论：年龄越小的离职人数较多，而年龄较大的离职人数较少。
# 家庭距离越远的离职人数较多，而家庭距离较近的离职人数较少。
# 月收入越低的离职人数较多，而月收入较高的离职人数较少。
# 曾经工作公司越多，离职人数较多，而曾经工作公司数量较少的离职人数较少。

# 6、离职和婚姻状况、性别的关系
# 离职和婚姻状况分析
# 添加婚姻状况的中文映射
marital_status_map = {
    'Single': '单身',
    'Married': '已婚',
    'Divorced': '离异'
}

data['MaritalStatus_zh'] = data['MaritalStatus'].map(marital_status_map)
sns.countplot(x="Attrition", hue="MaritalStatus_zh", data=data)
plt.xlabel('是否离职', fontsize=12)
plt.ylabel('婚姻状况', fontsize=12)
plt.title('离职和婚姻状况关系', fontsize=14)
plt.legend(title='婚姻状况', loc='upper right')
plt.savefig('../img/离职和婚姻状况关系.png', dpi=300, bbox_inches='tight')
plt.show()
# 离职和性别关系
gender_map = {
    'Male': '男',
    'Female': '女'
}
data['Gender'] = data['Gender'].map(gender_map)
sns.countplot(x="Attrition", hue="Gender", data=data)
plt.xlabel('是否离职', fontsize=12)
plt.ylabel('性别', fontsize=12)
plt.title('离职和性别关系', fontsize=14)
plt.legend(title='性别', loc='upper right')
plt.savefig('../img/离职和性别关系.png', dpi=300, bbox_inches='tight')
plt.show()

# 离职和其他变量的相关性分析
sns.pairplot(data=data, hue="Attrition", vars=["Age", "MonthlyIncome","NumCompaniesWorked", "PercentSalaryHike"])
plt.savefig('../img/离职和其他变量的相关性分析.png', dpi=300, bbox_inches='tight')
plt.show()
